gdk/monitor: Remove gdk_monitor_work_area and GdkMonitor::work-area
authorJonas Ådahl <jadahl@gmail.com>
Wed, 29 Jul 2020 13:47:48 +0000 (15:47 +0200)
committerJonas Ådahl <jadahl@gmail.com>
Wed, 29 Jul 2020 15:57:30 +0000 (17:57 +0200)
It's not a portable API, so remove it. The corresponding backend
specific functions are still available, if they were implemented, e.g.
gdk_macos_monitor_get_workarea() and gdk_x11_monitor_get_workarea().

22 files changed:
docs/reference/gdk/gdk4-sections.txt
gdk/broadway/gdksurface-broadway.c
gdk/gdkmonitor.c
gdk/gdkmonitor.h
gdk/gdkmonitorprivate.h
gdk/gdksurface.c
gdk/gdksurfaceprivate.h
gdk/macos/GdkMacosWindow.c
gdk/macos/gdkmacosmonitor.c
gdk/macos/gdkmacosmonitor.h
gdk/macos/gdkmacospopupsurface.c
gdk/macos/gdkmacostoplevelsurface.c
gdk/win32/gdkdisplay-win32.c
gdk/win32/gdkmonitor-win32.c
gdk/win32/gdksurface-win32.c
gdk/win32/gdkwin32monitor.h
gdk/x11/gdkmonitor-x11.c
gdk/x11/gdkscreen-x11.c
gdk/x11/gdksurface-x11.c
gdk/x11/gdkx11monitor.h
gtk/gtkwindow.c
testsuite/gtk/defaultvalue.c

index d6d5d19eb600f0ba5ee38cdc8026f44d4e439ca5..9b5973fb626e8ad0e2709e7347a652e2368c9a60 100644 (file)
@@ -1126,7 +1126,6 @@ GDK_TYPE_GL_PROFILE
 GdkMonitor
 gdk_monitor_get_display
 gdk_monitor_get_geometry
-gdk_monitor_get_workarea
 gdk_monitor_get_width_mm
 gdk_monitor_get_height_mm
 gdk_monitor_get_manufacturer
index 87a0642630e60bac2656044230b3a2ea0af03f80..ca68c5fbcd502f2ae8c4af2e1ebd64eae4d8c990 100644 (file)
@@ -556,12 +556,20 @@ gdk_broadway_surface_layout_popup (GdkSurface     *surface,
                                    int             height,
                                    GdkPopupLayout *layout)
 {
+  GdkMonitor *monitor;
+  GdkRectangle bounds;
   GdkRectangle final_rect;
   int x, y;
 
+  monitor = gdk_surface_get_layout_monitor (surface, layout,
+                                            gdk_monitor_get_geometry);
+  gdk_monitor_get_geometry (monitor, &bounds);
+
   gdk_surface_layout_popup_helper (surface,
                                    width,
                                    height,
+                                   monitor,
+                                   &bounds,
                                    layout,
                                    &final_rect);
 
index 5157caea0abaf7ec79053c8adb69c0634db0dfe1..46edc8a5c4d610dc143dcdd1b659fe4028a3bf3c 100644 (file)
@@ -51,7 +51,6 @@ enum {
   PROP_CONNECTOR,
   PROP_SCALE_FACTOR,
   PROP_GEOMETRY,
-  PROP_WORKAREA,
   PROP_WIDTH_MM,
   PROP_HEIGHT_MM,
   PROP_REFRESH_RATE,
@@ -112,14 +111,6 @@ gdk_monitor_get_property (GObject    *object,
       g_value_set_boxed (value, &monitor->geometry);
       break;
 
-    case PROP_WORKAREA:
-      {
-        GdkRectangle workarea;
-        gdk_monitor_get_workarea (monitor, &workarea);
-        g_value_set_boxed (value, &workarea);
-      }
-      break;
-
     case PROP_WIDTH_MM:
       g_value_set_int (value, monitor->width_mm);
       break;
@@ -222,12 +213,6 @@ gdk_monitor_class_init (GdkMonitorClass *class)
                         "The geometry of the monitor",
                         GDK_TYPE_RECTANGLE,
                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
-  props[PROP_WORKAREA] =
-    g_param_spec_boxed ("workarea",
-                        "Workarea",
-                        "The workarea of the monitor",
-                        GDK_TYPE_RECTANGLE,
-                        G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
   props[PROP_WIDTH_MM] =
     g_param_spec_int ("width-mm",
                       "Physical width",
@@ -316,38 +301,6 @@ gdk_monitor_get_geometry (GdkMonitor   *monitor,
   *geometry = monitor->geometry;
 }
 
-/**
- * gdk_monitor_get_workarea:
- * @monitor: a #GdkMonitor
- * @workarea: (out): a #GdkRectangle to be filled with
- *     the monitor workarea
- *
- * Retrieves the size and position of the “work area” on a monitor
- * within the display coordinate space. The returned geometry is in
- * ”application pixels”, not in ”device pixels” (see
- * gdk_monitor_get_scale_factor()).
- *
- * The work area should be considered when positioning menus and
- * similar popups, to avoid placing them below panels, docks or other
- * desktop components.
- *
- * Note that not all backends may have a concept of workarea. This
- * function will return the monitor geometry if a workarea is not
- * available, or does not apply.
- */
-void
-gdk_monitor_get_workarea (GdkMonitor   *monitor,
-                          GdkRectangle *workarea)
-{
-  g_return_if_fail (GDK_IS_MONITOR (monitor));
-  g_return_if_fail (workarea != NULL);
-
-  if (GDK_MONITOR_GET_CLASS (monitor)->get_workarea)
-    GDK_MONITOR_GET_CLASS (monitor)->get_workarea (monitor, workarea);
-  else
-    *workarea = monitor->geometry;
-}
-
 /**
  * gdk_monitor_get_width_mm:
  * @monitor: a #GdkMonitor
index 58592a5c323a6a32ee6801af39bce85f439332fc..31f1cd148c0ed744a501f21ea8a3bac3ca7e270a 100644 (file)
@@ -69,9 +69,6 @@ GDK_AVAILABLE_IN_ALL
 void              gdk_monitor_get_geometry        (GdkMonitor   *monitor,
                                                    GdkRectangle *geometry);
 GDK_AVAILABLE_IN_ALL
-void              gdk_monitor_get_workarea        (GdkMonitor   *monitor,
-                                                   GdkRectangle *workarea);
-GDK_AVAILABLE_IN_ALL
 int               gdk_monitor_get_width_mm        (GdkMonitor   *monitor);
 GDK_AVAILABLE_IN_ALL
 int               gdk_monitor_get_height_mm       (GdkMonitor   *monitor);
index cbed437740d6c9125c8b874fb09872b479a7889c..36c591a8f2c6845d2dba206a8cc63d3eb06da74a 100644 (file)
@@ -48,9 +48,6 @@ struct _GdkMonitor {
 
 struct _GdkMonitorClass {
   GObjectClass parent_class;
-
-  void (* get_workarea) (GdkMonitor   *monitor,
-                         GdkRectangle *geometry);
 };
 
 GdkMonitor *    gdk_monitor_new                 (GdkDisplay *display);
index 5c3b16170de7c17de8c8a10d1b0ae5cd843631ff..62fc8196f6b134867d3fd8931a7991a8ac1c19e7 100644 (file)
@@ -137,8 +137,10 @@ get_display_for_surface (GdkSurface *primary,
 }
 
 static GdkMonitor *
-get_monitor_for_rect (GdkDisplay         *display,
-                      const GdkRectangle *rect)
+get_monitor_for_rect (GdkDisplay          *display,
+                      const GdkRectangle  *rect,
+                      void               (*get_bounds) (GdkMonitor   *monitor,
+                                                        GdkRectangle *bounds))
 {
   int biggest_area = G_MININT;
   GdkMonitor *best_monitor = NULL;
@@ -152,7 +154,7 @@ get_monitor_for_rect (GdkDisplay         *display,
   for (i = 0; i < g_list_model_get_n_items (monitors); i++)
     {
       monitor = g_list_model_get_item (monitors, i);
-      gdk_monitor_get_workarea (monitor, &workarea);
+      get_bounds (monitor, &workarea);
 
       if (gdk_rectangle_intersect (&workarea, rect, &intersection))
         {
@@ -247,16 +249,35 @@ maybe_flip_position (int       bounds_pos,
   return primary;
 }
 
+GdkMonitor *
+gdk_surface_get_layout_monitor (GdkSurface      *surface,
+                                GdkPopupLayout  *layout,
+                                void           (*get_bounds) (GdkMonitor   *monitor,
+                                                              GdkRectangle *bounds))
+{
+  GdkDisplay *display;
+  GdkRectangle root_rect;
+
+  root_rect = *gdk_popup_layout_get_anchor_rect (layout);
+  gdk_surface_get_root_coords (surface->parent,
+                               root_rect.x,
+                               root_rect.y,
+                               &root_rect.x,
+                               &root_rect.y);
+
+  display = get_display_for_surface (surface, surface->transient_for);
+  return get_monitor_for_rect (display, &root_rect, get_bounds);
+}
+
 void
 gdk_surface_layout_popup_helper (GdkSurface     *surface,
                                  int             width,
                                  int             height,
+                                 GdkMonitor     *monitor,
+                                 GdkRectangle   *bounds,
                                  GdkPopupLayout *layout,
                                  GdkRectangle   *out_final_rect)
 {
-  GdkDisplay *display;
-  GdkMonitor *monitor;
-  GdkRectangle bounds;
   GdkRectangle root_rect;
   GdkGravity rect_anchor;
   GdkGravity surface_anchor;
@@ -277,10 +298,6 @@ gdk_surface_layout_popup_helper (GdkSurface     *surface,
                                &root_rect.x,
                                &root_rect.y);
 
-  display = get_display_for_surface (surface, surface->transient_for);
-  monitor = get_monitor_for_rect (display, &root_rect);
-  gdk_monitor_get_workarea (monitor, &bounds);
-
   rect_anchor = gdk_popup_layout_get_rect_anchor (layout);
   surface_anchor = gdk_popup_layout_get_surface_anchor (layout);
   gdk_popup_layout_get_offset (layout, &rect_anchor_dx, &rect_anchor_dy);
@@ -288,8 +305,8 @@ gdk_surface_layout_popup_helper (GdkSurface     *surface,
 
   final_rect.width = width - surface->shadow_left - surface->shadow_right;
   final_rect.height = height - surface->shadow_top - surface->shadow_bottom;
-  final_rect.x = maybe_flip_position (bounds.x,
-                                      bounds.width,
+  final_rect.x = maybe_flip_position (bounds->x,
+                                      bounds->width,
                                       root_rect.x,
                                       root_rect.width,
                                       final_rect.width,
@@ -298,8 +315,8 @@ gdk_surface_layout_popup_helper (GdkSurface     *surface,
                                       rect_anchor_dx,
                                       anchor_hints & GDK_ANCHOR_FLIP_X,
                                       &flipped_x);
-  final_rect.y = maybe_flip_position (bounds.y,
-                                      bounds.height,
+  final_rect.y = maybe_flip_position (bounds->y,
+                                      bounds->height,
                                       root_rect.y,
                                       root_rect.height,
                                       final_rect.height,
@@ -311,44 +328,44 @@ gdk_surface_layout_popup_helper (GdkSurface     *surface,
 
   if (anchor_hints & GDK_ANCHOR_SLIDE_X)
     {
-      if (final_rect.x + final_rect.width > bounds.x + bounds.width)
-        final_rect.x = bounds.x + bounds.width - final_rect.width;
+      if (final_rect.x + final_rect.width > bounds->x + bounds->width)
+        final_rect.x = bounds->x + bounds->width - final_rect.width;
 
-      if (final_rect.x < bounds.x)
-        final_rect.x = bounds.x;
+      if (final_rect.x < bounds->x)
+        final_rect.x = bounds->x;
     }
 
   if (anchor_hints & GDK_ANCHOR_SLIDE_Y)
     {
-      if (final_rect.y + final_rect.height > bounds.y + bounds.height)
-        final_rect.y = bounds.y + bounds.height - final_rect.height;
+      if (final_rect.y + final_rect.height > bounds->y + bounds->height)
+        final_rect.y = bounds->y + bounds->height - final_rect.height;
 
-      if (final_rect.y < bounds.y)
-        final_rect.y = bounds.y;
+      if (final_rect.y < bounds->y)
+        final_rect.y = bounds->y;
     }
 
   if (anchor_hints & GDK_ANCHOR_RESIZE_X)
     {
-      if (final_rect.x < bounds.x)
+      if (final_rect.x < bounds->x)
         {
-          final_rect.width -= bounds.x - final_rect.x;
-          final_rect.x = bounds.x;
+          final_rect.width -= bounds->x - final_rect.x;
+          final_rect.x = bounds->x;
         }
 
-      if (final_rect.x + final_rect.width > bounds.x + bounds.width)
-        final_rect.width = bounds.x + bounds.width - final_rect.x;
+      if (final_rect.x + final_rect.width > bounds->x + bounds->width)
+        final_rect.width = bounds->x + bounds->width - final_rect.x;
     }
 
   if (anchor_hints & GDK_ANCHOR_RESIZE_Y)
     {
-      if (final_rect.y < bounds.y)
+      if (final_rect.y < bounds->y)
         {
-          final_rect.height -= bounds.y - final_rect.y;
-          final_rect.y = bounds.y;
+          final_rect.height -= bounds->y - final_rect.y;
+          final_rect.y = bounds->y;
         }
 
-      if (final_rect.y + final_rect.height > bounds.y + bounds.height)
-        final_rect.height = bounds.y + bounds.height - final_rect.y;
+      if (final_rect.y + final_rect.height > bounds->y + bounds->height)
+        final_rect.height = bounds->y + bounds->height - final_rect.y;
     }
 
   final_rect.x -= surface->shadow_left;
index 55febf1dce4d58854ed7fe624caccc7dfc3b5672..c9410f506ecad9cc6b23e5ad255bb60f2a6fb0fc 100644 (file)
@@ -174,9 +174,16 @@ struct _GdkSurfaceClass
 void gdk_surface_set_state (GdkSurface      *surface,
                             GdkSurfaceState  new_state);
 
+GdkMonitor * gdk_surface_get_layout_monitor (GdkSurface      *surface,
+                                             GdkPopupLayout  *layout,
+                                             void           (*get_bounds) (GdkMonitor   *monitor,
+                                                                           GdkRectangle *bounds));
+
 void gdk_surface_layout_popup_helper (GdkSurface     *surface,
                                       int             width,
                                       int             height,
+                                      GdkMonitor     *monitor,
+                                      GdkRectangle   *bounds,
                                       GdkPopupLayout *layout,
                                       GdkRectangle   *out_final_rect);
 
index f226e9443c0d5ae3347277cee3f2fb0ab4a664d7..fba5d9b094e4fa2c874408d4f884b08e95caa1a9 100644 (file)
   monitor = _gdk_macos_display_get_monitor_at_display_coords ([self gdkDisplay],
                                                               currentLocation.x,
                                                               currentLocation.y);
-  gdk_monitor_get_geometry (monitor, &geometry);
-  gdk_monitor_get_workarea (monitor, &workarea);
+  gdk_macos_monitor_get_geometry (monitor, &geometry);
+  gdk_macos_monitor_get_workarea (monitor, &workarea);
   _edge_snapping_set_monitor (&self->snapping, &geometry, &workarea);
 
   /* Convert origins to GDK coordinates */
 
   monitor = _gdk_macos_surface_get_best_monitor ([self gdkSurface]);
   gdk_monitor_get_geometry (monitor, &geometry);
-  gdk_monitor_get_workarea (monitor, &workarea);
+  gdk_macos_monitor_get_workarea (monitor, &workarea);
 
   initialMoveLocation = [NSEvent mouseLocation];
 
index 91a85a0dfaa910fc0fbedd28866af80e52f2cbad..fdeadadcea1204dc05367b1a74e1b8a30613704e 100644 (file)
@@ -41,7 +41,18 @@ struct _GdkMacosMonitorClass
 
 G_DEFINE_TYPE (GdkMacosMonitor, gdk_macos_monitor, GDK_TYPE_MONITOR)
 
-static void
+/**
+ * gdk_macos_monitor_get_workarea:
+ * @monitor: a #GdkMonitor
+ * @workarea: (out): a #GdkRectangle to be filled with
+ *     the monitor workarea
+ *
+ * Retrieves the size and position of the “work area” on a monitor
+ * within the display coordinate space. The returned geometry is in
+ * ”application pixels”, not in ”device pixels” (see
+ * gdk_monitor_get_scale_factor()).
+ */
+void
 gdk_macos_monitor_get_workarea (GdkMonitor   *monitor,
                                 GdkRectangle *geometry)
 {
@@ -71,9 +82,6 @@ gdk_macos_monitor_get_workarea (GdkMonitor   *monitor,
 static void
 gdk_macos_monitor_class_init (GdkMacosMonitorClass *klass)
 {
-  GdkMonitorClass *monitor_class = GDK_MONITOR_CLASS (klass);
-
-  monitor_class->get_workarea = gdk_macos_monitor_get_workarea;
 }
 
 static void
index 64b91f887e3d4e2ce262ddd07c946aec93ed0d40..7be6e5ea28bf9a332e817d3e8310b28edbc78410 100644 (file)
@@ -38,6 +38,9 @@ typedef struct _GdkMacosMonitorClass GdkMacosMonitorClass;
 GDK_AVAILABLE_IN_ALL
 GType gdk_macos_monitor_get_type (void);
 
+void gdk_macos_monitor_get_workarea (GdkMonitor   *monitor,
+                                     GdkRectangle *geometry);
+
 G_END_DECLS
 
 #endif /* __GDK_MACOS_MONITOR_H__ */
index 520a717dfce4991c6ae0de1585fc39140776c135..37bee532ca80b31db9c7d79fa95eb7d07a54a4d3 100644 (file)
@@ -45,6 +45,8 @@ gdk_macos_popup_surface_layout (GdkMacosPopupSurface *self,
                                 int                   height,
                                 GdkPopupLayout       *layout)
 {
+  GdkMonitor *monitor;
+  GdkRectangle bounds;
   GdkRectangle final_rect;
   int x, y;
 
@@ -58,9 +60,15 @@ gdk_macos_popup_surface_layout (GdkMacosPopupSurface *self,
       self->layout = gdk_popup_layout_ref (layout);
     }
 
+  monitor = gdk_surface_get_layout_monitor (surface, layout,
+                                            gdk_macos_monitor_get_workarea);
+  gdk_macos_monitor_get_workarea (monitor, &bounds);
+
   gdk_surface_layout_popup_helper (GDK_SURFACE (self),
                                    width,
                                    height,
+                                   monitor,
+                                   &bounds,
                                    layout,
                                    &final_rect);
 
index 84076367742abcd7b3b3a6804b909d837d085145..a399150fe04630c3914c4b2176ce4d103cadcc9a 100644 (file)
@@ -173,7 +173,7 @@ _gdk_macos_toplevel_surface_present (GdkToplevel       *toplevel,
             {
               GdkRectangle visible;
 
-              gdk_monitor_get_workarea (monitor, &visible);
+              gdk_macos_monitor_get_workarea (monitor, &visible);
 
               if (x < visible.x)
                 x = visible.x;
index 27e094d5352cf299e6a30d404d98ce225a572986..9b196bf3daba70aa7ebe97665b7b370880783c9c 100644 (file)
@@ -227,8 +227,8 @@ _gdk_win32_display_init_monitors (GdkWin32Display *win32_display)
         primary_to_move = w32_ex_monitor;
 
       gdk_monitor_get_geometry (m, &geometry);
-      gdk_monitor_get_workarea (m, &workarea);
-      gdk_monitor_get_workarea (ex_monitor, &ex_workarea);
+      gdk_win32_monitor_get_workarea (m, &workarea);
+      gdk_win32_monitor_get_workarea (ex_monitor, &ex_workarea);
 
       if (memcmp (&workarea, &ex_workarea, sizeof (GdkRectangle)) != 0)
         {
index 9452f0f33b9abdda3676098ec4d7fcde14aa6fd9..0f02bef14f5304381537f10a844fbe4abe15429e 100644 (file)
@@ -851,7 +851,18 @@ _gdk_win32_monitor_compare (GdkWin32Monitor *a,
   return a == b ? 0 : a < b ? -1 : 1;
 }
 
-static void
+/**
+ * gdk_win32_monitor_get_workarea:
+ * @monitor: a #GdkMonitor
+ * @workarea: (out): a #GdkRectangle to be filled with
+ *     the monitor workarea
+ *
+ * Retrieves the size and position of the “work area” on a monitor
+ * within the display coordinate space. The returned geometry is in
+ * ”application pixels”, not in ”device pixels” (see
+ * gdk_monitor_get_scale_factor()).
+ */
+void
 gdk_win32_monitor_get_workarea (GdkMonitor   *monitor,
                                 GdkRectangle *dest)
 {
@@ -869,6 +880,4 @@ static void
 gdk_win32_monitor_class_init (GdkWin32MonitorClass *class)
 {
   G_OBJECT_CLASS (class)->finalize = gdk_win32_monitor_finalize;
-
-  GDK_MONITOR_CLASS (class)->get_workarea = gdk_win32_monitor_get_workarea;
 }
index ad967541872e69864f4f48b8cec6751d14c55fff..4ae96c7c62ced41812a8161b539bd66d9dd5aa38 100644 (file)
@@ -1293,12 +1293,20 @@ gdk_win32_surface_layout_popup (GdkSurface     *surface,
                                 int             height,
                                 GdkPopupLayout *layout)
 {
+  GdkMonitor *monitor;
+  GdkRectangle bounds;
   GdkRectangle final_rect;
   int x, y;
 
+  monitor = gdk_surface_get_layout_monitor (surface, layout,
+                                            gdk_win32_monitor_get_workarea);
+  gdk_win32_monitor_get_workarea (monitor, &bounds);
+
   gdk_surface_layout_popup_helper (surface,
                                    width,
                                    height,
+                                   monitor,
+                                   &bounds,
                                    layout,
                                    &final_rect);
 
@@ -2078,7 +2086,7 @@ calculate_aerosnap_regions (GdkW32DragMoveResizeContext *context)
 
       monitor = g_list_model_get_item (monitors, monitor_idx);
       g_object_unref (monitors);
-      gdk_monitor_get_workarea (monitor, &wa);
+      gdk_win32_monitor_get_workarea (monitor, &wa);
       gdk_monitor_get_geometry (monitor, &geometry);
 
       for (other_monitor_idx = 0;
@@ -2095,7 +2103,7 @@ calculate_aerosnap_regions (GdkW32DragMoveResizeContext *context)
 
           other_monitor = g_list_model_get_item (monitors, other_monitor_idx);
           g_object_unref (other_monitor);
-          gdk_monitor_get_workarea (other_monitor, &other_wa);
+          gdk_win32_monitor_get_workarea (other_monitor, &other_wa);
 
           /* An edge triggers AeroSnap only if there are no
            * monitors beyond that edge.
@@ -2239,7 +2247,7 @@ unsnap (GdkSurface  *window,
   if (impl->snap_stash == NULL)
     return;
 
-  gdk_monitor_get_workarea (monitor, &rect);
+  gdk_win32_monitor_get_workarea (monitor, &rect);
 
   GDK_NOTE (MISC, g_print ("Monitor work area %d x %d @ %d : %d\n", rect.width, rect.height, rect.x, rect.y));
 
@@ -2416,7 +2424,7 @@ snap_left (GdkSurface  *window,
 
   impl->snap_state = GDK_WIN32_AEROSNAP_STATE_HALFLEFT;
 
-  gdk_monitor_get_workarea (snap_monitor, &rect);
+  gdk_win32_monitor_get_workarea (snap_monitor, &rect);
 
   stash_window (window, impl);
 
@@ -2444,7 +2452,7 @@ snap_right (GdkSurface  *window,
 
   impl->snap_state = GDK_WIN32_AEROSNAP_STATE_HALFRIGHT;
 
-  gdk_monitor_get_workarea (snap_monitor, &rect);
+  gdk_win32_monitor_get_workarea (snap_monitor, &rect);
 
   stash_window (window, impl);
 
@@ -3207,7 +3215,7 @@ start_indicator (GdkSurface                   *window,
 
   display = gdk_surface_get_display (window);
   monitor = get_monitor_at_point (display, x, y);
-  gdk_monitor_get_workarea (monitor, &workarea);
+  gdk_win32_monitor_get_workarea (monitor, &workarea);
 
   maxysize = GetSystemMetrics (SM_CYVIRTUALSCREEN) / impl->surface_scale;
   start_size.x = start_size.y = 0;
index 873ab8026e38be4ca5524dcfadc1a32ea274af34..cbbf246f3eb7f81ee829d589f7ec5843187d7530 100644 (file)
@@ -45,6 +45,9 @@ typedef struct _GdkWin32MonitorClass GdkWin32MonitorClass;
 GDK_AVAILABLE_IN_ALL
 GType             gdk_win32_monitor_get_type            (void) G_GNUC_CONST;
 
+void gdk_win32_monitor_get_workarea (GdkMonitor   *monitor,
+                                     GdkRectangle *workarea);
+
 G_END_DECLS
 
 #endif  /* __GDK_WIN32_MONITOR_H__ */
index 2cb57501ed6cf248c4cc859e9f553f774b82a072..8d7a4e5807d9862ee1d48bec2951bd9bd2a174d8 100644 (file)
@@ -61,7 +61,18 @@ gdk_monitor_has_fullscreen_window (GdkMonitor *monitor)
   return has_fullscreen;
 }
 
-static void
+/**
+ * gdk_x11_monitor_get_workarea:
+ * @monitor: a #GdkMonitor
+ * @workarea: (out): a #GdkRectangle to be filled with
+ *     the monitor workarea
+ *
+ * Retrieves the size and position of the “work area” on a monitor
+ * within the display coordinate space. The returned geometry is in
+ * ”application pixels”, not in ”device pixels” (see
+ * gdk_monitor_get_scale_factor()).
+ */
+void
 gdk_x11_monitor_get_workarea (GdkMonitor   *monitor,
                               GdkRectangle *dest)
 {
@@ -101,7 +112,6 @@ gdk_x11_monitor_init (GdkX11Monitor *monitor)
 static void
 gdk_x11_monitor_class_init (GdkX11MonitorClass *class)
 {
-  GDK_MONITOR_CLASS (class)->get_workarea = gdk_x11_monitor_get_workarea;
 }
 
 XID
index 6a9638904091fcf9559ad70a181262c832d7547a..bfc0b2c80ffe99952e5d6753269c416bf9135ecf 100644 (file)
@@ -584,7 +584,6 @@ init_randr15 (GdkX11Screen *x11_screen)
       newgeo.height = rr_monitors[i].height / x11_screen->surface_scale;
 
       gdk_monitor_set_geometry (GDK_MONITOR (monitor), &newgeo);
-      g_object_notify (G_OBJECT (monitor), "workarea");
       gdk_monitor_set_physical_size (GDK_MONITOR (monitor),
                                      rr_monitors[i].mwidth,
                                      rr_monitors[i].mheight);
@@ -734,7 +733,6 @@ init_randr13 (GdkX11Screen *x11_screen)
           newgeo.height = crtc->height / x11_screen->surface_scale;
 
           gdk_monitor_set_geometry (GDK_MONITOR (monitor), &newgeo);
-          g_object_notify (G_OBJECT (monitor), "workarea");
           gdk_monitor_set_physical_size (GDK_MONITOR (monitor),
                                          output_info->mm_width,
                                          output_info->mm_height);
@@ -842,7 +840,6 @@ init_no_multihead (GdkX11Screen *x11_screen)
   height = HeightOfScreen (x11_screen->xscreen);
 
   gdk_monitor_set_geometry (GDK_MONITOR (monitor), &(GdkRectangle) { 0, 0, width, height });
-  g_object_notify (G_OBJECT (monitor), "workarea");
   gdk_monitor_set_physical_size (GDK_MONITOR (monitor), width_mm, height_mm);
   gdk_monitor_set_scale_factor (GDK_MONITOR (monitor), x11_screen->surface_scale);
 
index 95f340bc703d11ec4a3877bc1268fa864ec2b0fe..385a5c0ccda271e97f7409b62679fefb4071eb0d 100644 (file)
@@ -1534,12 +1534,20 @@ gdk_x11_surface_layout_popup (GdkSurface     *surface,
                               int             height,
                               GdkPopupLayout *layout)
 {
+  GdkMonitor *monitor;
+  GdkRectangle bounds;
   GdkRectangle final_rect;
   int x, y;
 
+  monitor = gdk_surface_get_layout_monitor (surface, layout,
+                                            gdk_x11_monitor_get_workarea);
+  gdk_x11_monitor_get_workarea (monitor, &bounds);
+
   gdk_surface_layout_popup_helper (surface,
                                    width,
                                    height,
+                                   monitor,
+                                   &bounds,
                                    layout,
                                    &final_rect);
 
index cd0a8d956584d7b0961b4d18b1d04c61f01dd33b..ddfa8a3f61129c569f09d921de275d37dc34f67f 100644 (file)
@@ -43,6 +43,10 @@ GType             gdk_x11_monitor_get_type            (void) G_GNUC_CONST;
 GDK_AVAILABLE_IN_ALL
 XID               gdk_x11_monitor_get_output          (GdkMonitor *monitor);
 
+GDK_AVAILABLE_IN_ALL
+void              gdk_x11_monitor_get_workarea        (GdkMonitor   *monitor,
+                                                       GdkRectangle *workarea);
+
 G_END_DECLS
 
 #endif  /* __GDK_X11_MONITOR_H__ */
index afd7f12c4037b98a4e259320b3cb9a61c1505e5d..80dde364936ced95e4fa79d7c5a9eab307bfb7a7 100644 (file)
@@ -4023,7 +4023,7 @@ gtk_window_guess_default_size (GtkWindow *window,
   GdkSurface *surface;
   GdkDisplay *display;
   GdkMonitor *monitor;
-  GdkRectangle workarea;
+  GdkRectangle geometry;
   int minimum, natural;
 
   widget = GTK_WIDGET (window);
@@ -4033,25 +4033,25 @@ gtk_window_guess_default_size (GtkWindow *window,
   if (surface)
     {
       monitor = gdk_display_get_monitor_at_surface (display, surface);
-      gdk_monitor_get_workarea (monitor, &workarea);
+      gdk_monitor_get_geometry (monitor, &geometry);
     }
   else
     {
       monitor = g_list_model_get_item (gdk_display_get_monitors (display), 0);
       if (monitor)
         {
-          gdk_monitor_get_workarea (monitor, &workarea);
+          gdk_monitor_get_geometry (monitor, &geometry);
           g_object_unref (monitor);
         }
       else
         {
-          workarea.width = G_MAXINT;
-          workarea.height = G_MAXINT;
+          geometry.width = G_MAXINT;
+          geometry.height = G_MAXINT;
         }
     }
 
-  *width = workarea.width;
-  *height = workarea.height;
+  *width = geometry.width;
+  *height = geometry.height;
 
   if (gtk_widget_get_request_mode (widget) == GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT)
     {
index d1bb4739bcc77d349a17314b5ed646216c9f965a..4947dac52f6c41755d2474afc50fd4b777445749 100644 (file)
@@ -200,8 +200,7 @@ test_type (gconstpointer data)
        continue;
 
       if (g_type_is_a (type, GDK_TYPE_MONITOR) &&
-          (strcmp (pspec->name, "geometry") == 0 ||
-           strcmp (pspec->name, "workarea") == 0))
+          (strcmp (pspec->name, "geometry") == 0))
         continue;
 
       if (g_type_is_a (type, GTK_TYPE_ABOUT_DIALOG) &&